package com.game.logic.fighting.skill.cd;

import lombok.extern.slf4j.Slf4j;

import java.util.Map;
import java.util.concurrent.*;

/// CD处理
@Slf4j
public class CDHandle {

    /// 全局共享的调度器（用于异步执行）
    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2, Thread.ofVirtual().factory());


    /// 存储技能CD任务的映射 key: rolesId, value: 任务引用
    public static final Map<String, ScheduledFuture<?>> CDTasks = new ConcurrentHashMap<>();

    /// 调度技能CD重置任务
    public static void scheduleSkillCDReset(String rolesId, int cdSeconds) {
        if (cdSeconds <= 0) {
            return;
        }
        log.debug("技能释放成功-进入cd{}", cdSeconds);
        // 取消之前的任务（如果存在）
        cancelSkillCD(rolesId);

        ScheduledFuture<?> scheduledTask = scheduler.schedule(() -> {
            CDTasks.remove(rolesId);
            log.debug("角色ID: {} 技能CD已重置", rolesId);
        }, cdSeconds, TimeUnit.SECONDS);

        // 保存任务引用
        CDTasks.put(rolesId, scheduledTask);
    }

    /// 修改技能CD时间
    public static void modifySkillCD(String rolesId, int newCDSeconds) {
        // 检查角色是否在CD中
        if (!CDTasks.containsKey(rolesId)) {
            log.warn("角色ID: {} 当前没有技能在CD中", rolesId);
        }

        // 重新调度CD重置任务
        scheduleSkillCDReset(rolesId, newCDSeconds);
        log.info("成功修改角色ID: {} 的技能CD时间为: {} 秒", rolesId, newCDSeconds);
    }

    /// 重置CD
    public static void cancelSkillCD(String rolesId) {
        ScheduledFuture<?> task = CDTasks.remove(rolesId);
        if (task != null && !task.isDone()) {
            boolean cancelled = task.cancel(false);
            if (cancelled) {
                CDTasks.remove(rolesId);
                log.debug("重置CD角色ID: {} 的技能CD", rolesId);
            }
        }
    }

    /// 获取角色剩余CD时间（秒）
    public static long getRemainingCDTime(String rolesId, int skillId) {
        ScheduledFuture<?> task = CDTasks.get(rolesId);
        if (task != null && !task.isDone()) {
            return task.getDelay(TimeUnit.SECONDS);
        }
        return 0;
    }

    /// 是否在cd中
    public static boolean isInCD(String rolesId, int skillId) {
        return CDTasks.containsKey(rolesId);
    }
}
